#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>

//进程替换
//可以把子进程替换掉去执行其他程序
int main(int argv,char* argc[])
{
  pid_t id = fork();
  assert(id!=-1);
  if(id==0)
  { 
    //child process
    sleep(1);
    printf("child process replace\n");
  //  char* const argv_[]={
      "ls",
      "-a",
      "-l",
      "--color=auto",
      NULL 
    };
  //  execv("usr/bin/ls",argv_);
  //execvp("ls",argv_);
  //execvp(argv[1],&argv[1]);




    char* const envp_[]={
      (char*)"MYENV=1112222333344444",
      NULL 
    };
   int i= putenv(envp_);
   extern  char** environ;
  //可以使用putenv，把自定义的环境变量加入到系统环境变量中，在使用environ传给子进程
 // execle("./mybin","mybin",NULL,envp_); //自定义的环境变量
 //execle("./mybin","mybin",NULL,environ); //实际上默认的环境变量你不传，子进程也能获取
 
 execle("./mybin","mybin",NULL,environ); //实际上默认的环境变量你不传，子进程也能获取


   // execl("./mybin","mybin",NULL);
    exit(1);  
  }
  int statu=0;
  pid_t ret = waitpid(id,&statu,0);
  if(ret>0)
  {
      printf("wait sucess exit code:%d   sig:%d\n",(statu>>8)&0xff,statu&0x7f);
  }
return 0;







  
  //.c -->exe-->load-->process ->运行->执行所写的代码
//printf("process is running\n");
 // exec*系列的函数，如果没成功执行，则返回-1 成功执行了，就没有返回值了，返回值没有任何意义 
  //execl("/usr/bin/ls"/*想要那个程序被执行*/,"ls","-a","-l",NULL/*想怎么样执行*/);//这个是可执行程序的路径
 /* 
  execlp("ls","ls","-a","-l",NULL);//记住后面结束参数是个NULL，必须写，这个第一个参数必须是环境变量
  //这里有两个ls,重复吗？不重复，一个告诉操作系统要执行谁，一个是怎么执行
 //为什么这里的printf没有被执行了？？？是因为在execl之后的代码被替换且被覆盖，开始执行新的代码就不能够执行了
  printf("process is ending\n");

 */
  return 0;
}

